package com.ux.util
{
	import flash.display.Sprite;
	import flash.geom.Rectangle;
	import flash.printing.PrintJob;
	import flash.printing.PrintJobOptions;
	import flash.utils.Dictionary;
	
	public class PrintUtil
	{
		
		/**
		 * @param clip : 프린트 대상
		 * @param isFull : 화면에 딱맞춤. ( 비율유지 ) false 일 경우 화면에 원본사이즈. 하지만 높이에 따라 페이지 증가는 가능.
		 */		
		public static function printClip(clip:Sprite, isFull:Boolean=true):void
		{   
			var initSize : Rectangle = new Rectangle( 0,0,clip.width, clip.height );
			var printJob:PrintJob = new PrintJob();     
			var numPages:int = 0;     
			var printArea:Rectangle;     
			
			if ( printJob.start() ) {              
				
				var scale : Number = 1;
				if( isFull ) scale =  printJob.pageWidth/clip.width;
				clip.scaleX = clip.scaleY = scale;
				
				
				
				/* Store reference to print area in a new variable! Will save on scalingcalculations later... */
				// A4 - 595 * 842
				printArea = new Rectangle(0, 0, printJob.pageWidth/scale, printJob.pageHeight/scale );   
				//				trace(" ==> PrintUtil printMovieClip : " + clip.height*scale, printJob.pageHeight);
				numPages = Math.ceil(clip.height*scale / printJob.pageHeight);              
				
				/* Add pages to print job */             
				for (var i:int = 0; i < numPages; i++) 
				{                     
					try{
						printJob.addPage(clip, printArea);                     
					}
					catch(e:Error){}            
					printArea.y += printArea.height;             
				}              
				
				/* Send print job to printer */             
				printJob.send();           
				
				/* Delete job from memory */    
				clip.scaleX = clip.scaleY = 1;
//				clip.width = initSize.width;
//				clip.height = initSize.height;
				
				initSize = null;
				printJob = null;      
				printArea = null;
				numPages = 0;
				
			}  
		}
		
		
		
		
		
		
		
		
		
		private static var _dicInitSize : Dictionary = new Dictionary( true );
		
		/**
		 * <br>리스트로 프린트하기 위해서는 최초 비율에 맞는 사이즈의 클립리스트를 던져야 한다.</br>
		 * @param list : 프린트 대상 리스트
		 * @param isFull : 화면에 딱맞춤. ( 비율유지 ) false 일 경우 화면에 원본사이즈.
		 */		
		public static function printList(list:Array, isFull:Boolean=true):void
		{   
			var len:int = list.length;
			for (var i:int = 0; i < len; i++) 
			{
				_dicInitSize[ list[i] ] = new Rectangle( 0,0,list[i].width, list[i].height );
			}
			
			var printJob:PrintJob = new PrintJob();     
			var printArea:Rectangle;     
			
			if ( printJob.start() ) {              
				
				/* Add pages to print job */      
				var scale : Number;
				for (i = 0; i < len; i++) 
				{                     
					scale = 1;
					
					if( isFull ) scale =  printJob.pageWidth/list[i].width;
//					list[i].width = list[i].width*scale;
//					list[i].height = list[i].height*scale;
					list[i].scaleX = list[i].scaleY = scale;
					printArea = new Rectangle(0, 0, printJob.pageWidth/scale, printJob.pageHeight/scale );
					
					try{
						printJob.addPage(list[i], printArea );                     
					}
					catch(e:Error){}
					printArea.y += printArea.height;             
				}              
				
				/* Send print job to printer */             
				printJob.send();           
				
				/* Delete job from memory */ 
				for (i = 0; i < len; i++) 
				{
					list[i].scaleX = list[i].scaleY = 1;
//					list[i].width = _dicInitSize[ list[i] ].width;
//					list[i].height = _dicInitSize[ list[i] ].height;
					
					delete _dicInitSize[ list[i] ];
				}
				
				printJob = null;      
				printArea = null;
				
			}  
		}
		
		
		
		
		public function PrintUtil()
		{
		}
	}
}